{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n",
" Si c'est votre première visite dans ce TP, lisez attentivement chacun des points détaillé après ce paragraphe.
\n",
" Si vous avez déjà commencer à travailler sur ce TP et que vous souhaiter vous déplacer rapidement dans une partie précise vous pouvez choisir la partie que vous souhaitez rejoindre ci-dessous.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
\n",
" La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
\n",
" Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
\n",
" Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
\n",
" La plateforme propose quelques outils de purge de la mémoire : \n",
"
\n",
" Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S
\n",
" est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.
A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.\n", "
pip install jupyterlab
jupyter notebook
Comme pour le TP1, TP2 et TP3, une bibliothèque regroupant quelques outils de la cryptologie vous ont été donnée. Chargeons l'intégralité des fonctionnalités qu'elle propose
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from OutilsCrypto import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vous êtes invité à travailler sur la première partie du TP1 pour vous refamiliariser avec les fonctionnalités de cette bibliothèque comme codex
, codex
, xedoc
, paquet
, mode2base
, Filtre
ainsi que les fonctions d'attaque par dictionnaire.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Ecrire la fonction C_VIGENERE(txt, clef)
qui prend en paramètre une message txt
et une clef
tous les deux des chaines de caractères et qui renvoie la chaine de caractère correspondant au chiffrement de Vigenère.
Ecrire la fonction D_VIGENERE(txt, clef)
qui prend en paramètre une message txt
et une clef
tous les deux des chaines de caractères et qui renvoie la chaine de caractère correspondant au déchiffrement de Vigenère.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Le principe de l'attaque de Kasiski est de déterminer la longueur de la clef en observant la longueur qui sépare certain cryptograme qui se répète. Cette longueur est le $PGCD$ de ces longueur.
\n", "Reprennez la fonction $PGCD$ du TP2
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def PGCD(a, b) :\n", " return 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dans un premier temps, il faut déterminer les cryptogrammes qui se répètent et dans la second temps, le nombre de caractère qui les sépare.
\n", "La fonction suivante, crée un arbre composée de tous les mots qui compose le message (txt
) qui ont une longueur entre a
(valeur par défaut 4) b
(valeur par défaut 7).
Avec l'exemple du mot \"BONBON\" l'abre dictionnaire des mots de longueur 2, 3 ou 4 donne :
\n", "BO
BON
BONB
ON
ONB
ONBO
NB
NBO
NBON
Le bout de code suivant, utilise l'abre des mot du cyptogramme pour construire le tableau associatif lst_mots
:\n",
"
txt=\"BONBON\"
, a=2
et b=4
alors cette fonction renverra le dictionnaire :{\n",
" 'BO' : [0, 3],\n",
" 'ON' : [1, 4],\n",
" 'NB' : [2],\n",
" 'BON' : [0, 3],\n",
" 'ONB' : [1],\n",
" 'NBO' : [2],\n",
" 'BONB' : [0],\n",
" 'ONBO' : [1],\n",
" 'NBON' : [1]\n",
"}
\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def VIGENERE_REPETITION(txt, a=3, b=7):\n",
" if(bTests"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"X=VIGENERE_REPETITION(\"BONBON\", 2, 4)\n",
"for clef in X : \n",
" print(\"'\"+str(clef)+\"':\\t\", X[clef])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Utilisez la fonction précédente pour écrire la fonction Taille_Clef
qui renvoie la taille hypotétique de la clef.
\n",
" Menu de navigation
\n",
" \n",
"
\n",
"
Une fois la taille de la clef estimée, il suffit de faire une attaque fréquentielle en espaçant le calcul des fréquence suivant la taille estimée. Rédiger la fonction suivante permettant de déterminer la clef.
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def AttaqueKasiski(txt, taille_min_clef=1) :\n", " return \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "